/**
 * @file AsyncLogger.h
 * @brief 异步日志实现，双缓冲机制
 * @author Enterprise Logger Team
 * @date 2024
 */

#ifndef LOGGER_ASYNCLOGGER_H
#define LOGGER_ASYNCLOGGER_H

#include "LogStream.h"
#include <memory>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <string>

namespace logger
{

    /**
     * @brief 异步日志类
     * 采用双缓冲技术，前台线程写入缓冲区，后台线程负责落盘
     */
    class AsyncLogger
    {
    public:
        // 使用大缓冲区
        typedef detail::FixedBuffer<detail::kLargeBufferSize> Buffer;
        typedef std::unique_ptr<Buffer> BufferPtr;
        typedef std::vector<BufferPtr> BufferVector;

        AsyncLogger(const std::string &basename,
                    size_t rollSize,
                    int flushInterval = 3);

        ~AsyncLogger();

        // 追加日志消息
        void append(const char *logline, int len);

        // 启动/停止
        void start();
        void stop();
        void flush();

    private:
        // 禁用拷贝
        AsyncLogger(const AsyncLogger &) = delete;
        AsyncLogger &operator=(const AsyncLogger &) = delete;

        // 后台线程函数
        void threadFunc();

        // 基本配置
        const int flushInterval_;    // 刷新间隔（秒）
        const size_t rollSize_;      // 日志文件滚动大小
        std::atomic<bool> running_;  // 运行状态
        const std::string basename_; // 日志文件基础名

        // 线程相关
        std::thread thread_;           // 后台线程
        std::mutex mutex_;             // 保护缓冲区的互斥锁
        std::condition_variable cond_; // 条件变量

        // 双缓冲机制
        BufferPtr currentBuffer_; // 当前缓冲区
        BufferPtr nextBuffer_;    // 预备缓冲区
        BufferVector buffers_;    // 待写入磁盘的缓冲区队列

        // 统计信息
        std::atomic<int64_t> totalWritten_; // 总写入字节数
        std::atomic<int64_t> droppedLines_; // 丢弃的日志行数
    };

} // namespace logger

#endif // LOGGER_ASYNCLOGGER_H
